package com.nidu.demo.role.gatewayimpl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.nidu.demo.role.gateway.RoleMenuGateway;
import com.nidu.demo.role.model.RoleMenu;
import com.nidu.demo.role.convertor.RoleMenuConvertor;
import com.nidu.demo.role.mapper.RoleMenuMapper;
import com.nidu.demo.role.mapper.dataobject.RoleMenuDO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Collectors;

@Component
@RequiredArgsConstructor
public class RoleMenuGatewayImpl implements RoleMenuGateway {

    private final RoleMenuMapper mapper;

    private final RoleMenuConvertor convertor;

    @Override
    public void bindRoleMenus(Long roleId, Set<Long> menuIds) {
        List<RoleMenu> bindings = menuIds.stream()
                .map(menuId -> RoleMenu.create(roleId, menuId))
                .collect(Collectors.toList());
        mapper.insert(convertor.toDataObjects(bindings));
    }

    @Override
    public void rebindRoleMenus(Long roleId, Set<Long> menuIds) {
        removeRoleMenus(roleId);
        bindRoleMenus(roleId, menuIds);
    }

    @Override
    public void removeRoleMenus(Long roleId) {
        LambdaQueryWrapper<RoleMenuDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(RoleMenuDO::getRoleId, roleId);
        mapper.delete(wrapper);
    }

    @Override
    public void removeMenuRoles(Long menuId) {
        LambdaQueryWrapper<RoleMenuDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(RoleMenuDO::getMenuId, menuId);
        mapper.delete(wrapper);
    }

    @Override
    public void removeRolesMenus(Set<Long> roleIds) {
        LambdaQueryWrapper<RoleMenuDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(RoleMenuDO::getRoleId, roleIds);
        mapper.delete(wrapper);
    }

    @Override
    public void removeMenusRoles(Set<Long> menuIds) {
        LambdaQueryWrapper<RoleMenuDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(RoleMenuDO::getMenuId, menuIds);
        mapper.delete(wrapper);
    }

    @Override
    public Set<Long> getMenuIdsByRoleId(Long roleId) {
        LambdaQueryWrapper<RoleMenuDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(RoleMenuDO::getRoleId, roleId);
        List<RoleMenuDO> roleMenuDOS = mapper.selectList(wrapper);
        if(CollUtil.isEmpty(roleMenuDOS)){
            return new HashSet<>();
        }
        return roleMenuDOS.stream().map(RoleMenuDO::getMenuId).collect(Collectors.toSet());
    }

    @Override
    public Set<Long> getRoleIdsByMenuId(Long menuId) {
        LambdaQueryWrapper<RoleMenuDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(RoleMenuDO::getMenuId, menuId);
        List<RoleMenuDO> roleMenuDOS = mapper.selectList(wrapper);
        if(CollUtil.isEmpty(roleMenuDOS)){
            return new HashSet<>();
        }
        return roleMenuDOS.stream().map(RoleMenuDO::getMenuId).collect(Collectors.toSet());
    }

    @Override
    public Map<Long, List<RoleMenu>> getByRoleIds(Set<Long> roleIds) {
        LambdaQueryWrapper<RoleMenuDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(RoleMenuDO::getRoleId, roleIds);
        List<RoleMenuDO> roleDOS = mapper.selectList(wrapper);
        if (CollUtil.isEmpty(roleDOS)) {
            return Collections.emptyMap();
        }
        List<RoleMenu> RoleMenus = convertor.toDomainObjects(roleDOS);
        return RoleMenus.stream().collect(Collectors.groupingBy(RoleMenu::getRoleId));
    }

    @Override
    public Map<Long, List<RoleMenu>> getByMenuIds(Set<Long> menuId) {
        LambdaQueryWrapper<RoleMenuDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(RoleMenuDO::getMenuId, menuId);
        List<RoleMenuDO> roleDOS = mapper.selectList(wrapper);
        if (CollUtil.isEmpty(roleDOS)) {
            return Collections.emptyMap();
        }
        List<RoleMenu> RoleMenus = convertor.toDomainObjects(roleDOS);
        return RoleMenus.stream().collect(Collectors.groupingBy(RoleMenu::getMenuId));
    }



}